package com.woupla.produit;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.extensions.model.dynaform.DynaFormControl;
import org.primefaces.extensions.model.dynaform.DynaFormModel;
import org.primefaces.extensions.model.dynaform.DynaFormRow;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.primefaces.model.TreeNode;

import com.woupla.account.CurrentUserManager;
import com.woupla.categ.CategoryEJB;
import com.woupla.model.Category;
import com.woupla.model.Companyproduit;
import com.woupla.model.CompanyproduitPK;
import com.woupla.model.ProduitGenerique;

@Named
@ViewScoped
public class ProduitController implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -33831375510313429L;

	@Inject
	private CompanyProductEJB produitEJB;
	private LazyDataModel<Companyproduit> companyProduits;
	private TreeNode rootCateg;
	private TreeNodePerso selectedProduct;
	private Companyproduit companyproduit;
	@Inject
	private CurrentUserManager userManager;
	@Inject
	private CategoryEJB categoryEJB;

	private int colFilters = 0;
	private final int colMaxFilter = 6;
	private String filter;
	private DynaFormRow row;

	private DynaFormModel dynaForm;

	public ProduitController() {
		dynaForm = new DynaFormModel();

		companyProduits = new LazyDataModel<Companyproduit>() {

			/**
			 * 
			 */
			private static final long serialVersionUID = 7739585744247531606L;

			@Override
			public List<Companyproduit> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				List<Companyproduit> list = produitEJB.findSortedFiltringProduct(userManager.getCurrentAccount().getCompany(), first, pageSize,
						sortField, sortOrder,
						filters);
				companyProduits.setRowCount(list.size());
				return list;
			}
		};
	}

	@PostConstruct
	public void init() {
		row = dynaForm.createRegularRow();
		List<Category> list = categoryEJB.findAllByParent(null);
		row.addControl(new ComboFilter("Author", list, false), "select", 1, 1);
	}

	public void gestFilters() {
		FacesContext context = FacesContext.getCurrentInstance();
		Map<String, String> param = context.getExternalContext().getRequestParameterMap();
		String s = param.get("javax.faces.source");
		int rowSel = Integer.parseInt(param.get("javax.faces.source").substring(33, 34));
		int colSel = Integer.parseInt(param.get("javax.faces.source").substring(35, 36));
		int index = (rowSel - 1) * colMaxFilter + (colSel - 1);
		colFilters = index;
		DynaFormControl dynaFormControl = dynaForm.getControls().get(index);
		ComboFilter comboFilter = (ComboFilter) dynaFormControl.getData();
		if (index < dynaForm.getControls().size()-1 || index==0 && dynaForm.getControls().size() >1) {
			for (int i = index + 1; i < dynaForm.getControls().size(); i++) {
				ComboFilter combo = (ComboFilter) dynaForm.getControls().get(i).getData();
				combo.setVisible(false);
				combo.setValue("");
			}
			/*
			 * DynaFormRow rowTemp = dynaForm.getRegularRows().get(rowSel-1);
			 * for (int i = colSel; i < rowTemp.getElements().size(); i++) {
			 * rowTemp.getElements().get(i).; }
			 */
			ComboFilter combo;
			if(comboFilter.getValue() == null){
				if(index>0){
					combo =  (ComboFilter) dynaForm.getControls().get(index-1).getData();
					filter = combo.getValue().toString();
					
				}else {
					filter = null;
					List<Category> list = categoryEJB.findAllByParentLabel(null);
					comboFilter.setCategories(list);
					if (!list.isEmpty())
						comboFilter.setVisible(true);
				}
				populateTree();
			}else{
				combo = (ComboFilter) dynaForm.getControls().get(index + 1).getData();
				List<Category> list = categoryEJB.findAllByParentLabel(comboFilter.getValue().toString());
				combo.setCategories(list);
				if (!list.isEmpty())
					combo.setVisible(true);
				filter = comboFilter.getValue().toString();
				populateTree();
			}
		} else {
			addFilter(comboFilter.getValue().toString());
		}

	}

	public void addFilter(String category) {
		if (colFilters > colMaxFilter) {
			colFilters = 0;
			row = dynaForm.createRegularRow();
		}
		List<Category> list = categoryEJB.findAllByParentLabel(category);
		if (!list.isEmpty()) {
			row.addControl(new ComboFilter("Author", list, false), "select", 1, 1);
		}
		filter = category;
		populateTree();

	}

	/**
	 * @return the companyProduits
	 */
	public LazyDataModel<Companyproduit> getCompanyProduits() {
		return companyProduits;
	}

	/**
	 * @param companyProduits
	 *            the companyProduits to set
	 */
	public void setCompanyProduits(LazyDataModel<Companyproduit> companyProduits) {
		this.companyProduits = companyProduits;
	}

	/**
	 * @return the rootCateg
	 */
	public TreeNode getRootCateg() {
		return rootCateg;
	}

	public void prepareProduct() {
		companyproduit = new Companyproduit();
		companyproduit.setProduitGenerique(selectedProduct.getProduitGenerique());
		companyproduit.setLabel(selectedProduct.getProduitGenerique().getLabel());
	}

	public void createProductCompany() {
		CompanyproduitPK pk = new CompanyproduitPK();
		pk.setCompany(userManager.getCurrentAccount().getCompany().getId());
		pk.setProduit(selectedProduct.getProduitGenerique().getId());
		companyproduit.setCompanyproduitPK(pk);
		companyproduit.setCompany(userManager.getCurrentAccount().getCompany());
		produitEJB.createProduct(companyproduit);
	}

	/**
	 * @param rootCateg
	 *            the rootCateg to set
	 */
	public void populateTree() {
		rootCateg = new DefaultTreeNode("root", null);
		if (filter != null) {
			Category category = categoryEJB.findByLabel(filter);
			addChildren(category, rootCateg);
		} else {
			addChildren(null, rootCateg);
		}
	}

	private void addChildren(Category parent, TreeNode parentNode) {
		List<Category> categs = categoryEJB.findAllByParent(parent);
		if (categs.isEmpty()) {
			for (ProduitGenerique produit : parent.getProduitGeneriqueCollection()) {
				TreeNode produitNode = new DefaultTreeNode(new TreeNodePerso(null, produit, true), parentNode);
			}
		}
		else {
			for (Category category : categs) {
				TreeNode child = new DefaultTreeNode(new TreeNodePerso(category, null, false), parentNode);
				addChildren(category, child);
			}
		}

	}

	/**
	 * @return the selectedProduct
	 */
	public TreeNodePerso getSelectedProduct() {
		return selectedProduct;
	}

	/**
	 * @param selectedProduct
	 *            the selectedProduct to set
	 */
	public void setSelectedProduct(TreeNodePerso selectedProduct) {
		this.selectedProduct = selectedProduct;
	}

	/**
	 * @return the companyproduit
	 */
	public Companyproduit getCompanyproduit() {
		return companyproduit;
	}

	/**
	 * @param companyproduit
	 *            the companyproduit to set
	 */
	public void setCompanyproduit(Companyproduit companyproduit) {
		this.companyproduit = companyproduit;
	}

	/**
	 * @return the dynaForm
	 */
	public DynaFormModel getDynaForm() {
		return dynaForm;
	}

	/**
	 * @param dynaForm
	 *            the dynaForm to set
	 */
	public void setDynaForm(DynaFormModel dynaForm) {
		this.dynaForm = dynaForm;
	}

}
